#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
图像格式转换工具 - 解决手机图像无法打开的问题
"""

import cv2
import os
import sys
from PIL import Image
import numpy as np

def check_and_convert_image(input_path, output_path=None):
    """
    检查并转换图像格式
    
    Args:
        input_path: 输入图像路径
        output_path: 输出图像路径（可选）
    
    Returns:
        bool: 转换是否成功
    """
    print(f"正在检查图像: {input_path}")
    
    # 检查文件是否存在
    if not os.path.exists(input_path):
        print(f"❌ 错误: 文件不存在 - {input_path}")
        return False
    
    # 检查文件大小
    file_size = os.path.getsize(input_path)
    print(f"文件大小: {file_size / 1024:.2f} KB")
    
    if file_size == 0:
        print("❌ 错误: 文件为空")
        return False
    
    # 尝试使用PIL打开图像
    try:
        print("正在使用PIL打开图像...")
        with Image.open(input_path) as img:
            print(f"✅ PIL成功打开图像")
            print(f"图像格式: {img.format}")
            print(f"图像模式: {img.mode}")
            print(f"图像尺寸: {img.size}")
            
            # 转换为RGB模式（如果需要）
            if img.mode != 'RGB':
                print(f"转换图像模式: {img.mode} -> RGB")
                img = img.convert('RGB')
            
            # 转换为numpy数组
            img_array = np.array(img)
            print(f"图像数组形状: {img_array.shape}")
            
            # 生成输出路径
            if output_path is None:
                name, ext = os.path.splitext(input_path)
                output_path = f"{name}_converted.jpg"
            
            # 使用OpenCV保存
            print(f"正在保存转换后的图像: {output_path}")
            success = cv2.imwrite(output_path, cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR))
            
            if success:
                print(f"✅ 图像转换成功: {output_path}")
                return True
            else:
                print("❌ 错误: OpenCV保存失败")
                return False
                
    except Exception as e:
        print(f"❌ PIL打开失败: {str(e)}")
        
        # 尝试使用OpenCV直接打开
        try:
            print("正在尝试使用OpenCV直接打开...")
            img = cv2.imread(input_path)
            if img is not None:
                print(f"✅ OpenCV成功打开图像")
                print(f"图像尺寸: {img.shape}")
                
                if output_path is None:
                    name, ext = os.path.splitext(input_path)
                    output_path = f"{name}_converted.jpg"
                
                success = cv2.imwrite(output_path, img)
                if success:
                    print(f"✅ 图像转换成功: {output_path}")
                    return True
                else:
                    print("❌ 错误: OpenCV保存失败")
                    return False
            else:
                print("❌ 错误: OpenCV无法打开图像")
                return False
        except Exception as e2:
            print(f"❌ OpenCV打开失败: {str(e2)}")
            return False

def batch_convert_images(input_dir, output_dir=None):
    """
    批量转换目录中的图像
    
    Args:
        input_dir: 输入目录
        output_dir: 输出目录（可选）
    """
    if output_dir is None:
        output_dir = os.path.join(input_dir, "converted")
    
    os.makedirs(output_dir, exist_ok=True)
    
    # 支持的图像格式
    supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif', '.webp']
    
    print(f"正在扫描目录: {input_dir}")
    
    converted_count = 0
    failed_count = 0
    
    for filename in os.listdir(input_dir):
        if any(filename.lower().endswith(ext) for ext in supported_formats):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, f"converted_{filename}")
            
            print(f"\n处理文件: {filename}")
            if check_and_convert_image(input_path, output_path):
                converted_count += 1
            else:
                failed_count += 1
    
    print(f"\n转换完成:")
    print(f"✅ 成功转换: {converted_count} 个文件")
    print(f"❌ 转换失败: {failed_count} 个文件")
    print(f"输出目录: {output_dir}")

def main():
    """主函数"""
    print("=" * 50)
    print("图像格式转换工具")
    print("=" * 50)
    
    if len(sys.argv) < 2:
        print("使用方法:")
        print("  python image_converter.py <图像文件路径>")
        print("  python image_converter.py <目录路径> --batch")
        print("\n示例:")
        print("  python image_converter.py image.jpg")
        print("  python image_converter.py C:/Users/Administrator/Desktop --batch")
        return
    
    input_path = sys.argv[1]
    
    if len(sys.argv) > 2 and sys.argv[2] == "--batch":
        # 批量转换模式
        if os.path.isdir(input_path):
            batch_convert_images(input_path)
        else:
            print("❌ 错误: 批量模式需要提供目录路径")
    else:
        # 单文件转换模式
        if os.path.isfile(input_path):
            check_and_convert_image(input_path)
        else:
            print("❌ 错误: 文件不存在")

if __name__ == "__main__":
    main()
